/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package algoritmos_busqueda;

/**
 *
 * @author stbn
 */
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JOptionPane;
public class BusquedaSimple extends Thread {
    List<Cuadrado> abiertos = new ArrayList<Cuadrado>();
    List<Cuadrado> cerrados = new ArrayList<Cuadrado>();   
    Mapa mapa;
    Cuadrado destino;

    public BusquedaSimple(Mapa m)
    {
        mapa = m;        
    }
    
    public void buscarDestino()
    {
        boolean encontrado = false;
        Cuadrado cuadradoActual;
        List<Cuadrado> vecinos = new ArrayList<Cuadrado>();
        
        
        abiertos.add(mapa.obtenerorigen());
        //JOptionPane.showMessageDialog(null, "despues de añadir origen");
        

        do
        {
            if (abiertos.isEmpty())
            {
                JOptionPane.showMessageDialog(null, "No se ha encontrado el destino");
                encontrado = true;  //para evitar bucle infinito
            }


            cuadradoActual = abiertos.get(0);
            cuadradoActual.pintar(1);
            abiertos.remove(0);
            cerrados.add(cuadradoActual);

            if (cuadradoActual.esDestino())
            {
                encontrado = true;
                //JOptionPane.showMessageDialog(null, "Se ha encontrado el destino");
                destino = cuadradoActual;
            }

            vecinos = mapa.obtenervecinos(cuadradoActual);
            Iterator iteradorVecinos = vecinos.iterator();
            while(iteradorVecinos.hasNext())
            {
                Cuadrado vecinoActual = (Cuadrado) iteradorVecinos.next();

                //JOptionPane.showMessageDialog(null, "basura");
                vecinoActual.pintar(1);

                if(!abiertos.contains(vecinoActual) && !cerrados.contains(vecinoActual))
                {                    
                    vecinoActual.establecerpredecesor(cuadradoActual);
                    abiertos.add(vecinoActual);
                }
            }

           
            //JOptionPane.showMessageDialog(null, "basura");

            //Esperar esperar = new Esperar();
            //esperar.start();
            try
            {
                Thread.currentThread().sleep(101 - Ventana.velocidadPersonaje);
            }
            catch(Exception e)
            {
                
            }
            while(Ventana.velocidadPersonaje == 0)
            {
                try
            {
                Thread.currentThread().sleep(10);
            }
            catch(Exception e)
            {

            }
            }



            
        }
        while(encontrado == false);
    }

    public void dibujarcamino()
    {
        Cuadrado cuadradoActual = destino;

        while(cuadradoActual != mapa.obtenerorigen())
        {
            cuadradoActual.pintar(2);
            if (!cuadradoActual.obtenerpredecesor().esobstaculo()) cuadradoActual = cuadradoActual.obtenerpredecesor();
            try
            {
                Thread.currentThread().sleep(101 - Ventana.velocidadPersonaje);
            }
            catch(Exception e)
            {

            }
            while(Ventana.velocidadPersonaje == 0)
            {
                try
            {
                Thread.currentThread().sleep(10);
            }
            catch(Exception e)
            {

            }
            }
        }
        cuadradoActual.pintar(2);

    }

    public void run()
    {
        buscarDestino();
        dibujarcamino();
    }


}




